# Java 中算术移位与逻辑移位的区别

# 一、算术移位

算术移位,符号位不变。

符号位是 1,移位后还是 1。符号位是 0,移位后还是 0。

Java 中用 >><<表示算术移位。

# 二、逻辑移位

逻辑移位后,符号位填充总是 0。

Java 中用 >>><<<表示逻辑移位。

# 三、代码

    public static void main(String []args) {
        // 十进制正数: 8
        // 0b 表示是个二进制
        int n = 0b00000000000000000000000000001000;
        System.out.println(n + " binary value: " + Integer.toBinaryString(n));

        // 算术右移一位变为 4,高位用符号位 0 填充
        System.out.println(n + " shift arithmetic right result: " + (n >> 1) + " binary value: " + Integer.toBinaryString(n >> 1));

        // 逻辑右移一位,高位用 0 填充,因此正数没有影响
        System.out.println(n + " shift logical right result: " + (n >>> 1) + " binary value: " + Integer.toBinaryString(n >>> 1));


        // 十进制负数: -8
        // 负数在计算机中用补码表示
        int m = 0b11111111111111111111111111111000;
        System.out.println(m + " binary value: " + Integer.toBinaryString(m));

        // 算术右移一位变为 -4,高位用符号位 1 填充
        System.out.println(m + " shift arithmetic right result: " + (m >> 1) + " binary value: " + Integer.toBinaryString(m >> 1));

        // 逻辑右移一位,高位用 0 填充,打印忽略前面的 0 了,完整是:01111111111111111111111111111100
        System.out.println(m + " shift logical right result: " + (m >>> 1) + " binary value: " + Integer.toBinaryString(m >>> 1));
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 四、运行结果

8 binary value: 1000
8 shift arithmetic right result: 4 binary value: 100
8 shift logical right result: 4 binary value: 100
-8 binary value: 11111111111111111111111111111000
-8 shift arithmetic right result: -4 binary value: 11111111111111111111111111111100
-8 shift logical right result: 2147483644 binary value: 1111111111111111111111111111100
1
2
3
4
5
6